#include <iostream>
#include <unistd.h>
#include <stdlib.h>
#include <functional>
#include <vector>
#include <string>
#include <signal.h>
#include <sys/wait.h>

// int main()
// {
//     if(fork() == 0)
//     {
//         sleep(1);
//         int a = 10;
//         a /= 0;

//         exit(0);
//     }
//     int status = 0;
//     waitpid(-1, &status, 0);

//     printf("exit signal: %d, core dump: %d\n", (status&0x7F),(status>>7)&1);

//     return 0;
// }



// void handler(int signo)
// {
//     printf("get a signo: %d\n", signo);
//     // 捕捉了 11 号信号，没执行默认动作，也没有退出进程
// }

int main()
{
    printf("Hello Island\n");
    printf("Hello Island\n");
    printf("Hello Island\n");
    
    // signal(11, handler);
    
    int a = 10;
    a /= 0;

    printf("Hello Island\n");
    printf("Hello Island\n");

    // int *p = nullptr;
    // *p = 100;
    while(true);
}




// // 定时器功能
// using func_t = std::function<void()>;

// int gcount = 0;
// std::vector<func_t> gfuncs;

// // 1. handler 是一个信号处理函数，当接收到 SIGALRM 信号时被调用
// // 2. 在处理函数内部，通过遍历 gfuncs 中的所有函数并调用它们，执行所有注册的任务
// // 3. 然后输出 gcount 的值，并重新设置一个定时器（alarm(1)），使得下一个 SIGALRM 信号在 1 秒后再次发送


// // 如果我们把下面操作，信号 更换成 硬件中断，那么就是 OS 的操作原理

// void handler(int signo)
// {
//     for(auto &f: gfuncs)
//     {
//         f();
//     }
//     std::cout << "gcount : "<< gcount << std::endl;
//     alarm(1);
// }

// int main()
// {
//     gfuncs.push_back([](){
//         //std::cout << "我是一个日志任务" << std::endl;
//         std::cout << "我是一个内核刷新操作" << std::endl;
//     });

//     gfuncs.push_back([](){
//         //std::cout << "我是一个下载任务" << std::endl;
//         std::cout << "我是一个检测进程时间片的操作，如果时间片到了，我会切换进程" << std::endl;
//     });
    
//     gfuncs.push_back([](){
//         //std::cout << "我是一个mysql任务" << std::endl;
//         std::cout << "我是一个内存管理操作，定期清理操作系统内部的内存碎片" << std::endl;
//     });

//     alarm(1); // 一次性的闹钟，一旦超时 alarm 自动取消
//     signal(SIGALRM, handler);

//     //while(true) gcount++;

//     while(true)
//     {
//         pause();
//         std::cout << "我醒来了..." <<std::endl;
//         gcount++;
//     }

// }






// int number= 0;
// void die(int signumber)
// {
//     printf("get a sig: %d, count: %d\n", signumber, number);
//     exit(0);
// }

// int main()
// {
//     alarm(3);
//     sleep(1);
//     int n = alarm(0); // 0： 取消闹钟
//     printf("n: %d\n", n);

//     // // 统计我的服务器在 1s 可以将计数器累加多少
//     // alarm(1); // 会在 1s 后收到信号
//     // signal(SIGALRM, die);

//     // while(true)
//     // {
//     //     number++;
//     //     //printf("count: %d\n", number++);
//     // }
//     return 0;
// }










// // 通过raise 来给自己发送特点信号
// int main()
// {
//     int cnt = 5;
//     while(true)
//     {
//         std::cout << "IsLand 1314" << std::endl;
//         cnt--;
//         if(cnt<=0)
//             //raise(9);
//             abort();
//         sleep(1);
//     }
// }






// // 形成 自己的 kill 命令
// void Usage(std::string proc)
// {
//     std::cout << "Usage: " << proc << " signumber processid " << std::endl;
// }

// // ./mykill 9 1234
// int main(int argc, char *argv[])
// {
//     if(argc != 3)
//     {
//         Usage(argv[0]);
//         exit(1);
//     }

//     int signumber = std::stoi(argv[1]);
//     pid_t id = std::stoi(argv[2]);

//     int n = ::kill(id, signumber);

//     if(n < 0)
//     {
//         perror("kill");
//         exit(2);
//     }
//     exit(0);
// }













// void Handler(int signo)
// {
//     // 对应的信号被触发，内核会将对应的信号编号，传递给自定义方法
//     std::cout << "Get a signal, signal number is : " << signo << std::endl; 
// }

// int main()
// {
//     // signal 怎么不放在循环里面
//     // signal：如果没有产生 2 或者 3 号信号呢？

//     for(int signo = 1; signo < 32; signo++) // 自定义捕捉所有信号
//     {
//         signal(SIGQUIT, Handler); // 把默认终止 -> 执行自定义方法： Handler
//         // 当我们输入 kill -x 就会捕捉 x 信号，无法被杀死
//         // 但是 kill -9 无法被捕捉，直接杀死进程
//         std::cout << "自定义捕捉信号" << signo << std::endl;
//     }

//     //signal(SIGINT, Handler); // 把默认终止 -> 执行自定义方法： Handler
//     //signal(SIGQUIT, Handler); // 把默认终止 -> 执行自定义方法： Handler


//     while(true)
//     {
//         std::cout << "hello world" << std::endl;
//         sleep(1);  
//     }
// }